package com.wzcl.app.service.common;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;

@Log4j2
@Service
@PropertySource(value = {"classpath:application-config.properties"}, encoding = "utf-8")
public class AliMsgService {

    @Value("${sms.accessKeyId}")
    private String accessId;    //账号
    @Value("${sms.accessKeySecret}")
    private String accessKey;   //秘钥
    // @Value("${sms.msgSign}")
    private String signName = "望子成龙在线";    //短信签名
    @Value("${sms.codeTemplate}")
    private String codeTemplate;//验证码模板名
    @Value("${sms.product}")
    private String product;
    @Value("${sms.domain}")
    private String domain;
    @Value("${sms.regionId}")
    private String regionId;


    /**
     * 发信
     */
    public Boolean sendMsg(String phone, String code){
        IClientProfile profile = DefaultProfile.getProfile(regionId, accessId, accessKey);
        DefaultProfile.addEndpoint(regionId, product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        //组装请求对象
        SendSmsRequest request = new SendSmsRequest();
        //使用post提交
        request.setMethod(MethodType.POST);
        //必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
        request.setPhoneNumbers(phone);
        //必填:短信签名-可在短信控制台中找到
        request.setSignName(signName);
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode(codeTemplate);
        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
        //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
        request.setTemplateParam("{\"code\":" + code + "}");

        boolean ok = false;
        //请求失败这里会抛ClientException异常
        SendSmsResponse acsResponse = null;
        try {
            acsResponse = acsClient.getAcsResponse(request);
            ok = acsResponse.getCode() != null && acsResponse.getCode().equals("OK");
            if(!ok){
                log.info("{}发送短信失败，ERROR_CODE：{}",phone,acsResponse.getCode());
            }
        } catch (ClientException e){
            log.info("{}发送短信失败:{}",phone,e.getErrMsg());
        }catch (Exception e){
            log.info("{}发送短信失败:{}",phone,e.getMessage());
        }
        return ok;
    }

}
